package com.pawernode.config;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.amqp.core.*;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;
import java.util.Map;

/**
 * RabbitMQ配置类，用于声明交换机、队列和绑定关系
 */
@Configuration
@ConfigurationProperties(prefix = "my")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class RabbitConfig {

    private String exchangeName;
    private String queueName;

    /**
     * 创建一个直接交换机
     *
     * @return DirectExchange类型的交换机
     */
    @Bean
    public DirectExchange directExchange() {
        return ExchangeBuilder // 默认持久化的
                .directExchange(exchangeName) // 交换机名称
                .build();
    }

    /**
     * 创建一个队列
     *
     * @return Queue类型的队列
     */
    @Bean
    public Queue queue() {
        // Queue(String name, boolean durable, boolean exclusive, boolean autoDelete, @Nullable Map<String, Object> arguments)
        Map<String, Object> arguments = new HashMap<>();
        // 设置队列消息溢出时拒绝发布消息，默认是删除头部的消息
//        arguments.put("x-overflow","reject-publish");
        // 设置队列最大长度为5
//        arguments.put("x-max-length",5);
        // 设置队列只允许一个消费者消费，也就是单一消费者
//        arguments.put("x-single-active-consumer",true);
        // 设置队列的容量
//        arguments.put("x-max-length-bytes",1024);
        arguments.put("x-max-priority",10); // 设置队列的优先级为10
        return new Queue(queueName, true,false,false,arguments);
    }

    /**
     * 将队列绑定到交换机上
     *
     * @param directExchange 直接交换机
     * @param queue 队列
     * @return Binding类型的绑定关系
     */
    @Bean
    public Binding binding(DirectExchange directExchange, Queue queue) {
        return BindingBuilder.bind(queue).to(directExchange).with("info");
    }
}
